package com.sky.task;

import cn.hutool.core.util.ObjectUtil;
import com.sky.constant.MessageConstant;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Administrator
 * @version 1.0
 * @description: 订单定时任务类
 * @date 2024/1/28 10:24
 */
@Slf4j
//@Component
public class OrderTask {
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理超时未支付的订单（每一分钟检测一次）
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void disposeTimeoutUnpayOrders(){
        //1、查询出所有超时未支付的订单（【15分钟前】下的单，并且现在的【订单状态】还是【待支付】的）
        // select * from orders where order_time <= #{当前时间 - 15分钟}  and status = 1
        LocalDateTime dateTime = LocalDateTime.now().minusMinutes(15);
        List<Orders> ordersList = orderMapper.queryByOrderTimeAndStatus(dateTime, Orders.PENDING_PAYMENT);

        //2、判断有没有此类订单，如果没有，直接结束
        if(ObjectUtil.isEmpty(ordersList)){
            return;
        }
        log.info("处理超时未支付的订单：{}",ordersList);

        //3、如果有此类订单，修改订单状态为【已取消】、订单取消时间、订单取消原因
        // update orders set status = 6, cancel_time = #{当前时间}, cancel_reason = '超时未支付,自动取消' where id in ('','','')
        Orders setParam = Orders.builder().status(Orders.CANCELLED).cancelTime(LocalDateTime.now()).cancelReason(MessageConstant.ORDER_TIMEOUT_UNPAY).build();
        Set<Long> ids = ordersList.stream().map(Orders::getId).collect(Collectors.toSet());
        orderMapper.batchUpdate(setParam,ids);

        // 另一个思路
        //update orders set status = 6, cancel_time = #{当前时间}, cancel_reason = '超时未支付,自动取消'
        //     where order_time <= #{当前时间 - 15分钟}  and status = 1

        // 日期加减函数
        /*
            加一个小时：SELECT DATE_SUB(NOW(),INTERVAL 1 HOUR);    //SENCOND MINUTE HOUR DAY MONTH YEAR
            减一个小时：SELECT DATE_ADD(NOW(),INTERVAL 1 HOUR);

            加一个小时：SELECT SUBDATE(NOW(),INTERVAL 1 HOUR);
            减一个小时：SELECT ADDDATE(NOW(),INTERVAL 1 HOUR);

            加一个小时：SELECT DATE_FORMAT(NOW() - INTERVAL 1 HOUR,'%Y-%m-%d %H-%i-%s')
            减一个小时：SELECT DATE_FORMAT(NOW() + INTERVAL 1 HOUR,'%Y-%m-%d %H-%i-%s')
        */
    }


    /**
     * 处理一直处于派送中的订单（每天凌晨一点检测一次）
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void disposeProgressOrders(){
        //1、查询出所有派送中的订单（【晚上12点前】下的单，并且到次日凌晨一点【订单状态】还是【派送中】的）
        // select * from orders where order_time <= #{当前时间 - 1个小时}  and status = 4
        LocalDateTime dateTime = LocalDateTime.now().minusHours(1);
        List<Orders> ordersList = orderMapper.queryByOrderTimeAndStatus(dateTime, Orders.DELIVERY_IN_PROGRESS);

        //2、判断有没有此类订单，如果没有，直接结束
        if(ObjectUtil.isEmpty(ordersList)){
            return;
        }
        log.info("处理超时未完成的订单：{}",ordersList);

        //3、如果有此类订单，修改订单状态为【已完成】
        // update orders set status = 6 where id in ('','','')
        Orders setParam = Orders.builder().status(Orders.COMPLETED).build();
        Set<Long> ids = ordersList.stream().map(Orders::getId).collect(Collectors.toSet());
        orderMapper.batchUpdate(setParam,ids);

        // 另一个思路
        //update orders set status = 6, cancel_time = #{当前时间}, cancel_reason = '超时未支付,自动取消'
        //     where order_time <= #{当前时间 - 15分钟}  and status = 1
    }
}
